/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tcr.main;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.tcr.entities.Client;
import com.tcr.main.R;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;


/**
 *
 * @author V.D
 * 
 * Activity permettant l'affichage du menu de modification de l'utilisateur connecte a l'application
 * 
 */
public class ModifierProfil extends Activity {

    private final String URLTCR = "http://10.0.2.2:8080/TheCityRater-war/services/utilisateurs/";
    private Button validerB;
    private Button annulerB;
    private String mdp;
    private String nom;
    private String prenom;
    private String mail;
    private String tel;
    private Toast erreur;
    private Client client;
    private Intent intent;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.modifierclient);

        // On recupere les infos stockés dans TheCityRater dont on a besoin
        // comme la, les informations sur le client
        intent = getIntent();
        client = (Client) intent.getExtras().get("User");
        
        // On creer un Toast pour afficher les eventuelles erreurs
        erreur = Toast.makeText(this.getApplicationContext(), "", Toast.LENGTH_LONG);
        erreur.setGravity(Gravity.CENTER_HORIZONTAL, 0, -100);
        
        
        validerB = (Button) findViewById(R.modifierC.valider);
        annulerB = (Button) findViewById(R.modifierC.annuler);

        // On met dans les EditText les valeurs des informations du client logges
        ((EditText) findViewById(R.modifierC.login)).setText(client.getLogin());
        ((EditText) findViewById(R.modifierC.mdp)).setText(client.getMotDePasse());
        ((EditText) findViewById(R.modifierC.nom)).setText(client.getNom());
        ((EditText) findViewById(R.modifierC.prenom)).setText(client.getPrenom());
        ((EditText) findViewById(R.modifierC.email)).setText(client.getEmail());
        ((EditText) findViewById(R.modifierC.tel)).setText(client.getTelephone());

        // On lance les verifications afin de savoir si oui ou non l'utilisateur sera modifie
        validerB.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View arg0, MotionEvent arg1) {
                switch (arg1.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        verifications();

                }
                return true;
            }
        });

        // On retourne a l'activity Accueil
        annulerB.setOnTouchListener(
                new View.OnTouchListener() {

                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        switch (arg1.getAction()) {
                            case MotionEvent.ACTION_DOWN:
                                Intent intent = new Intent(ModifierProfil.this, Accueil.class);
                                intent.putExtra("User", client);
                                startActivity(intent);

                        }

                        return true;
                    }
                });

    }

    /** 
     * Methode permettant de verifier les informations de modification du client
     * Si il n'y a pas d'erreur, l'utilisateur est donc modifie
     */
    public void verifications() {
        erreur.setText("");
        mdp = ((EditText) findViewById(R.modifierC.mdp)).getText().toString();
        nom = ((EditText) findViewById(R.modifierC.nom)).getText().toString();
        prenom = ((EditText) findViewById(R.modifierC.prenom)).getText().toString();
        mail = ((EditText) findViewById(R.modifierC.email)).getText().toString();
        tel = ((EditText) findViewById(R.modifierC.tel)).getText().toString();

        if (mdp == null || mdp.equals("")
                || nom == null || nom.equals("") || prenom == null || prenom.equals("")
                || mail == null || mail.equals("") || tel == null || tel.equals("")) {
            erreur.setText("Remplissez tous les champs");
            erreur.show();
            return;
        } else if (client.getMotDePasse().equals(mdp) && client.getNom().equals(nom)
                && client.getPrenom().equals(prenom) && client.getEmail().equals(mail)
                && client.getTelephone().equals(tel)) {
            erreur.setText("Vous n'avez fais aucune modification");
            erreur.show();
            return;
        }
        if (!client.getMotDePasse().equals(mdp)) {
            if (mdp.length()
                    < 5) {
                erreur.setText("Mot de passe trop court (5min)");
                erreur.show();
                return;
            } else if (!mdp.matches(
                    "[a-z0-9]*")) {
                erreur.setText("Pas de caractère spécial pour le password");
                erreur.show();
                return;
            }
        }
        if (!client.getNom().equals(nom)) {
            if (nom.length()
                    < 5) {
                erreur.setText("Nom trop court (5min)");
                erreur.show();
                return;
            } else if (!nom.matches(
                    "[a-zA-Z]*")) {
                erreur.setText("Nom incorrect");
                erreur.show();
                return;
            }
        }
        if (!client.getPrenom().equals(prenom)) {
            if (prenom.length()
                    < 3) {
                erreur.setText(" Prénom trop court (3min)");
                erreur.show();
                return;
            } else if (!prenom.matches(
                    "[a-zA-Z]*")) {
                erreur.setText("Prénom incorrect");
                erreur.show();
                return;
            }
        }
        if (!client.getEmail().equals(mail)) {
            if (!mail.matches(
                    "^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\\.[a-z]{2,4}$")) {
                erreur.setText("Mail incorrect");
                erreur.show();
                return;
            } else {
                if (userExiste(mail)) {
                    erreur.show();
                    return;
                }
            }
        }
        if (!client.getTelephone().equals(tel)) {
            if (!tel.matches(
                    "^[0-9]{10}$")) {
                erreur.setText("Téléphone incorrect (10chiffres)");
                erreur.show();
                return;
            }
        }

        // On verifie qu'il n' y a pas d'erreur suite a la modification du client
        if (modificationClient()) {
            client.setMotDePasse(mdp);
            client.setNom(nom);
            client.setPrenom(prenom);
            client.setEmail(mail);
            client.setTelephone(tel);


            // Avertissement de succes de la modification
            new AlertDialog.Builder(this).setTitle("Succés").setMessage("Votre compte a été modifié, retour à l'accueil.").setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    intent = new Intent(ModifierProfil.this, Accueil.class);
                    intent.putExtra("User", client);
                    startActivity(intent);
                }
            }).show();
        } else {
            erreur.show();
        }


    }

    /**
     * On verifie que l'utilisateur ne veut pas prendre un mail deja utilise
     * @param mail
     * @return 
     */
    public boolean userExiste(String mail) {
        try {

            HttpClient httpClient = new DefaultHttpClient();

            HttpGet httpGet = new HttpGet(URLTCR + mail);

            HttpResponse response;

            response = httpClient.execute(httpGet);

            HttpEntity entity = response.getEntity();

            entity = response.getEntity();

            if (entity != null) {
                erreur.setText("Mail déja utilisé");
                return true;
            } else {
                return false;
            }
        } catch (Exception ex) {
            erreur.setText("Serveur inaccessible");

            return true;

        }
    }

    /**
     * Modification du client en BD par WS
     * @return 
     *  true si tout c'est bien passee 
     *  false si probleme
     */
    public boolean modificationClient() {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPut httpPut = new HttpPut(URLTCR);

            // On créer un objet JSON qui sera transmis au serveur
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("ID", client.getId());
            jsonObject.put("MDP", mdp);
            jsonObject.put("NOM", nom);
            jsonObject.put("PRENOM", prenom);
            jsonObject.put("MAIL", mail);
            jsonObject.put("TELEPHONE", tel);


            // On transforme le JSON afin de pouvoir transmettre les informations
            StringEntity stringEntity = new StringEntity(jsonObject.toString());
            stringEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            httpPut.setHeader("Accept", "application/json");
            httpPut.setHeader("Content-Type", "application/json");
            httpPut.setEntity(stringEntity);
            HttpResponse response;

            response = httpClient.execute(httpPut);
            return true;
        } catch (Exception ex) {
            erreur.setText("Erreur lors de la modification");
            return false;
        }

    }
}
